﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using LightLog.Framework.Extensions;
using Microsoft.AspNetCore.Http;

namespace LightLog.Framework
{
    public class HttpHelper
    { /// <summary>
      /// 取得客户真实IP(如果有代理，会返回多个ip地址)
      /// </summary>
      /// <returns></returns>
        public static string GetTrueUserIP()
        {
            HttpContextAccessor context = new HttpContextAccessor();
            string UserIP = context.HttpContext.Request.Headers["HTTP_X_FORWARDED_FOR"];
            if (string.IsNullOrEmpty(UserIP))
                UserIP = context.HttpContext.Request.Headers["REMOTE_ADDR"];
            if (string.IsNullOrEmpty(UserIP))
                UserIP = context.HttpContext.Connection.RemoteIpAddress.ToString();
            if (UserIP == "::1")
                UserIP = "127.0.0.1";
            if (UserIP.IndexOf(".") == -1)//没有“.”肯定是非IPv4格式
                UserIP = "0.0.0.1";
            else
            {
                string temp = UserIP;
                UserIP = string.Empty;

                IPAddress ip;
                if (temp.IndexOf(",") != -1)
                {
                    //有“,”，估计多个代理。
                    temp = temp.Replace(" ", "").Replace("'", "");
                    string[] TempIPs = temp.Split(',');

                    StringBuilder sb = new StringBuilder();
                    foreach (var item in TempIPs)
                    {
                        if (IPAddress.TryParse(item, out ip))
                        {
                            sb.AppendFormat(",{0}", ip.ToString());
                            //UserIP += "," + ip.ToString();
                        }
                    }
                    if (sb.ToString().Length > 0)
                        UserIP = sb.ToString().Substring(1);
                }
                else
                {
                    if (IPAddress.TryParse(temp, out ip))
                        UserIP = ip.ToString();
                }

                if (UserIP.Length == 0)
                    UserIP = "0.0.0.2";
            }
            return UserIP;
            //https://www.cnblogs.com/a14907/p/6445431.html
            /*
             小结：
1、REMOTE_ADDR 不可被修改，但是可能会获得代理服务器的IP，而不是实际客户端的IP。
2、通过 HTTP_VIA、HTTP_X_FORWARDED_FOR 我们可以获得代理服务器所代理的信息，但是这依靠代理服务器的支持。另外，这两个值可以被修改。我们通过它获得的信息可能是不真实的。
另，HTTP_X_FORWARDED_FOR 的信息可能是一个集合，不含 REMOTE_ADDR 中的代理服务器IP。没有一个完美的解决获得客户端IP地址的方法，我们只能在上面2个信息中取舍。
             */
        }


        public static string GetUserAgent()
        {
            HttpContextAccessor context = new HttpContextAccessor();
            string userAgent = context.HttpContext.Request.Headers["User-Agent"];
            return userAgent??"";
        }


    }
}
